package com.alm.handle.service.impl;

import com.alibaba.fastjson.JSON;
import com.alm.common.core.domain.AjaxResult;
import com.alm.common.utils.file.FileUtils;
import com.alm.entity.PasingByteModel;
import com.alm.handle.core.domain.entity.rq.ImgModelRq;
import com.alm.handle.core.domain.entity.rs.ImgDataRS;
import com.alm.handle.service.SysImgService;
import com.alm.handle.util.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 屏幕刷图相关服务实现类
 *
 * @author 詹泽峰
 * @date 2024/08/07 11:08
 */
@Slf4j
@Service
public class SysImgServiceImpl implements SysImgService {

    @Resource
    private RedisUtil redisUtil;

    /**
     * 处理图片数据并发送第一包数据给插座
     *
     * @param rq 前端提供参数表单
     * @return com.alm.common.core.domain.AjaxResult
     * @author: 詹泽峰
     * @date: 2024/8/8 10:17
     */
    @Override
    public AjaxResult sendFirstData(ImgModelRq rq) {
        // 读取图片取模后数据
        String imgData = FileUtils.readFileByPath("test.txt");
        StringBuffer firstData = new StringBuffer();
        // 处理imgData，只取数值部分
        imgData = DataUtils.processImgData(imgData);
        // 一包限制200字节，即为长度400的十六进制字符串
        List<String> imageDataList = new ArrayList<String>();
        ImageUtil.getData(imgData, 400, imageDataList);
        // 拼装总包数
        if (!imageDataList.isEmpty()) {
            firstData.append(com.alm.util.Misc.int2hexStr4(imageDataList.size() + 1));
        } else {
            return AjaxResult.error("图片数据为空");
        }
        // 拼装当前包数、图片类型、图片编号、字体颜色、XY位置，前端提供十六进制字符串
        firstData.append(com.alm.util.Misc.int2hexStr4(1));
        DataUtils.appendImgFirstData(firstData, 1, rq.getImgType());
        DataUtils.appendImgFirstData(firstData, 1, rq.getImgId());
        DataUtils.appendImgFirstData(firstData, 2, rq.getFontColor());
        DataUtils.appendImgFirstData(firstData, 2, rq.getX());
        DataUtils.appendImgFirstData(firstData, 2, rq.getY());
        DataUtils.appendImgFirstData(firstData, 2, rq.getWidth());
        DataUtils.appendImgFirstData(firstData, 2, rq.getHeight());
        // 发送第一包数据，调用封装命令方法
        String command = DataUtils.setCommand(rq.getMac(), rq.getDevType(), "A1", firstData.toString());
        // 发送指令
        boolean isSuccess = SendMessage.sendMessage(ByteUtils.hexStrToBytes(command), rq.getMac());
        if (isSuccess) {
            // 存储处理后图片数据列表到redis，5分钟过期时间
            redisUtil.set(SoketEleKey.IMG_DEBUG + rq.getMac().toUpperCase(), JSON.toJSONString(imageDataList), 1800);
            return AjaxResult.success("第一包发送成功");
        } else {
            return AjaxResult.error("第一包发送失败");
        }
    }

    /**
     * 第二包开始发送图片数据
     *
     * @author: 詹泽峰
     * @date: 2024/8/8 11:46
     * @param header 数据包封装对象
     */
    @Override
    public void sendImgData(PasingByteModel.Header header) {
        // Data解析
        String data = ByteUtils.arrayToString(header.getIntData(), 0, header.getIntData().size());
        ImgDataRS imgDataRS = DataUtils.parseImgDataFeedback(data);
        // 如果状态不在1-4内（成功，x越界，y越界，图片宽度越界）
        if (imgDataRS.getState() < 1 || imgDataRS.getState() > 4) {
            return;
        }
        // Redis中取出未图片数据列表
        List<String> imageDataList = JSON.parseArray(JSON.toJSON(redisUtil.get(SoketEleKey.IMG_DEBUG + header.getDvcId().toUpperCase())).toString(), String.class);
        // 拼装下一个要发送的data区数据
        if (imgDataRS.getCurrentPackNum() <= imageDataList.size()) {
            StringBuffer currentData = new StringBuffer();
            currentData.append(com.alm.util.Misc.int2hexStr4(imageDataList.size() + 1));
            currentData.append(com.alm.util.Misc.int2hexStr4(imgDataRS.getCurrentPackNum() + 1));
            currentData.append(imageDataList.get(imgDataRS.getCurrentPackNum() - 1));
            // 发送第一包数据，调用封装命令方法
            String command = DataUtils.setCommand(header.getDvcId(), com.alm.util.Misc.int2hexStr2(header.getDvcType().byteValue()), "A1", currentData.toString());
            // 发送指令
            SendMessage.sendMessage(ByteUtils.hexStrToBytes(command), header.getDvcId());
        }
    }
}
